/*
 * Copyright 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.compose.ui.demos.gestures

import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.awaitEachGesture
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.isAltPressed
import androidx.compose.ui.input.pointer.isBackPressed
import androidx.compose.ui.input.pointer.isCapsLockOn
import androidx.compose.ui.input.pointer.isCtrlPressed
import androidx.compose.ui.input.pointer.isForwardPressed
import androidx.compose.ui.input.pointer.isFunctionPressed
import androidx.compose.ui.input.pointer.isMetaPressed
import androidx.compose.ui.input.pointer.isNumLockOn
import androidx.compose.ui.input.pointer.isPrimaryPressed
import androidx.compose.ui.input.pointer.isScrollLockOn
import androidx.compose.ui.input.pointer.isSecondaryPressed
import androidx.compose.ui.input.pointer.isShiftPressed
import androidx.compose.ui.input.pointer.isSymPressed
import androidx.compose.ui.input.pointer.isTertiaryPressed
import androidx.compose.ui.input.pointer.pointerInput

/**
 * Demo to show the state of buttons and meta keys
 */
@Composable
fun ButtonMetaStateDemo() {
    var control by remember { mutableStateOf(false) }
    var alt by remember { mutableStateOf(false) }
    var shift by remember { mutableStateOf(false) }
    var meta by remember { mutableStateOf(false) }
    var sym by remember { mutableStateOf(false) }
    var function by remember { mutableStateOf(false) }
    var numLock by remember { mutableStateOf(false) }
    var scrollLock by remember { mutableStateOf(false) }
    var capsLock by remember { mutableStateOf(false) }

    var primary by remember { mutableStateOf(false) }
    var secondary by remember { mutableStateOf(false) }
    var tertiary by remember { mutableStateOf(false) }
    var back by remember { mutableStateOf(false) }
    var forward by remember { mutableStateOf(false) }

    fun trippedModifier(isActive: Boolean, color: Color) =
        Modifier.background(if (isActive) color else Color.Transparent).fillMaxWidth()

    Column(
        Modifier.pointerInput(Unit) {
            awaitEachGesture {
                do {
                    val event = awaitPointerEvent()
                    val metaState = event.keyboardModifiers
                    control = metaState.isCtrlPressed
                    alt = metaState.isAltPressed
                    shift = metaState.isShiftPressed
                    meta = metaState.isMetaPressed
                    sym = metaState.isSymPressed
                    function = metaState.isFunctionPressed
                    numLock = metaState.isNumLockOn
                    scrollLock = metaState.isScrollLockOn
                    capsLock = metaState.isCapsLockOn

                    val buttons = event.buttons
                    primary = buttons.isPrimaryPressed
                    secondary = buttons.isSecondaryPressed
                    tertiary = buttons.isTertiaryPressed
                    back = buttons.isBackPressed
                    forward = buttons.isForwardPressed
                } while (event.changes.any { it.pressed })
                // In the future, hover events should work also, but it isn't
                // implemented yet.
                control = false
                alt = false
                shift = false
                meta = false
                sym = false
                function = false
                numLock = false
                scrollLock = false
                capsLock = false
                primary = false
                secondary = false
                tertiary = false
                back = false
                forward = false
            }
        }
    ) {
        Text("Demonstrates which buttons and meta keys are active during pointer input")
        Row {
            Column(Modifier.weight(1f)) {
                Text("Shift", trippedModifier(shift, Color.Blue))
                Text("Control", trippedModifier(control, Color.Green))
                Text("Alt", trippedModifier(alt, Color.Yellow))
                Text("Meta", trippedModifier(meta, Color.Red))
                Text("Sym", trippedModifier(sym, Color.Cyan))
                Text("Function", trippedModifier(function, Color.Magenta))
                Text("Num Lock", trippedModifier(numLock, Color.DarkGray))
                Text("Scroll Lock", trippedModifier(scrollLock, Color.Gray))
                Text("Caps Lock", trippedModifier(capsLock, Color.LightGray))
            }
            Column(Modifier.weight(1f)) {
                Text("Left", trippedModifier(primary, Color.Red))
                Text("Right", trippedModifier(secondary, Color.Yellow))
                Text("Middle", trippedModifier(tertiary, Color.Green))
                Text("Back", trippedModifier(back, Color.Blue))
                Text("Forward", trippedModifier(forward, Color.Magenta))
            }
        }
    }
}
